package com.sz.admin.system.service.impl;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.sz.admin.system.mapper.SysDeptMapper;
import com.sz.admin.system.pojo.po.SysDept;
import com.sz.admin.system.service.SysDeptDirectService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

import static com.sz.admin.system.pojo.po.table.SysDeptTableDef.SYS_DEPT;

/**
 * <p>
 * 部门表 直接查询服务实现类
 * </p>
 *
 * @author sz
 * @since 2025-11-13
 */
@Service
@RequiredArgsConstructor
public class SysDeptDirectServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements SysDeptDirectService {

    /**
     * 获取指定部门的所有下级部门ID（直接查询sys_dept表）
     * @param deptIds 父部门ID列表
     * @return 所有下级部门ID列表
     */
    @Override
    public List<Long> getSubordinateDeptIds(List<Long> deptIds) {
        if (deptIds == null || deptIds.isEmpty()) {
            return new ArrayList<>();
        }
        
        List<Long> result = new ArrayList<>();
        // 递归查询所有下级部门
        findSubordinateDeptIds(deptIds, result);
        return result;
    }
    
    /**
     * 递归查询下级部门ID
     * @param parentIds 父部门ID列表
     * @param result 结果列表
     */
    private void findSubordinateDeptIds(List<Long> parentIds, List<Long> result) {
        if (parentIds == null || parentIds.isEmpty()) {
            return;
        }
        
        // 查询直接子部门
        QueryWrapper wrapper = QueryWrapper.create()
                .select(SYS_DEPT.ID)
                .from(SYS_DEPT)
                .where(SYS_DEPT.PID.in(parentIds))
                .and(SYS_DEPT.DEL_FLAG.eq("F")); // 只查询未删除的部门
                
        List<Long> childIds = listAs(wrapper, Long.class);
        
        if (childIds != null && !childIds.isEmpty()) {
            // 将子部门ID添加到结果中
            result.addAll(childIds);
            // 递归查询子部门的子部门
            findSubordinateDeptIds(childIds, result);
        }
    }
}